实现 Java 接口
视频锁定
{$ currentTime | date:'mm:ss' $}
{$ timeLeft | date:'mm:ss' $}
通过接口的方式,可以更好的分离宿主环境与脚本之间的依赖,Java 暴露给脚本以接口,脚本实现接口,然后在 Java 中可以在完全不知道脚本是如何实现的前提下进行调用,我们 来看一个简单的示例:
var task = {
run : function(){
print("start execute..."); }
}
脚本实现了 java.lang.Runnable 接口,Runnable 接口仅有一个方法:run。然后在 Java 代码中,我们从引擎对象 engine 中获得此对象 task,然后创建一个新的线程以使用 Runnable 接口的实现:
public static void main(String args[]){
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
try {
engine.eval(new java.io.FileReader("scripts/script.js"));
} catch (ScriptException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Invocable invEngine = (Invocable)engine;
Object obj = engine.get("task");
Runnable r = invEngine.getInterface(obj, Runnable.class);
Thread thread = new Thread(r);
thread.start();
}
通过引擎的 getInterface(object, class)来获得此接口的实现,由于 JavaScript 的弱类 型,Java 端只能通过判断对象是否与接口的定义匹配来确定其是否实现了指定的接口,因此 getInterface 的第二个参数是一个“类”类型。 另一个相关的例子是,在 JavaScript 代码中实现 Java 接口,所有代码均属于 JavaScript 代码:
var task = new java.lang.Runnable(){
run : function(){
print("start execute...");
}
};
var thread = new java.lang.Thread(task);
thread.start();
与上例相同,会得到下面的执行结果:
start execute...
在线练习
{$ activeFileHint $}